package com.pet.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.pet.constant.MessageConstant;
import com.pet.dto.web.WechatUserLoginDTO;
import com.pet.entity.WechatUser;
import com.pet.exception.LoginFailedException;
import com.pet.mapper.UserMapper;
import com.pet.properties.WeChatProperties;
import com.pet.service.UserService;
import com.pet.utils.HttpClientUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

@Service
@Slf4j
public class UserServiceImpl implements UserService {

    //微信服务接口地址
    public static final String WX_LOGIN = "https://api.weixin.qq.com/sns/jscode2session";

    @Autowired
    private WeChatProperties weChatProperties;
    @Autowired
    private UserMapper userMapper;


    /**
     * 微信登录
     * @param wechatUserLoginDTO
     * @return
     */
    public WechatUser wxLogin(WechatUserLoginDTO wechatUserLoginDTO) {
        //调用微信接口服务，获得当前微信用户的openid
        String openid = getOpenid(wechatUserLoginDTO.getCode());
        log.info("当前微信用户的openid:{}",openid);

        //判断openid是否为空，如果为表明小程序端登录失败，抛出业务异常
        if(openid == null){
            throw new LoginFailedException(MessageConstant.LOGIN_FAILED);
        }

        WechatUser wechatUser = userMapper.getByOpenid(openid);
        //判断当前微信用户是否为新用户
        if (wechatUser == null){
            log.info("为新用户：{}完成自动注册", wechatUser);
            //判断为新用户则自动完成注册
            wechatUser = WechatUser.builder()
                    .openid(openid)
                    .createTime(LocalDateTime.now())
                    .build();
            userMapper.insert(wechatUser);//插入新用户信息
        }



        //返回用户对象
        return wechatUser;
    }

    //获取openid函数
    /**
     * 通过微信授权登录获取用户的OpenID
     *
     * @param code 微信授权登录后返回的临时票据code
     * @return 用户的唯一标识OpenID
     */
    private String getOpenid(String code){
        // 创建一个HashMap用于存储请求微信服务器所需的参数
        Map<String, String> map = new HashMap<>();
        // 向map中添加appid，这是微信小程序的唯一标识，从配置属性中获取
        map.put("appid", weChatProperties.getAppid());
        // 向map中添加secret，这是微信小程序的密钥，用于确保请求的安全性，从配置属性中获取
        map.put("secret", weChatProperties.getSecret());
        // 向map中添加js_code，这是前端通过微信授权登录接口获得的临时票据
        map.put("js_code", code);
        // 向map中添加grant_type，这里固定为"authorization_code"，表示授权码类型
        map.put("grant_type", "authorization_code");

        // 使用HttpClientUtil工具类发送GET请求到微信服务器登录接口（WX_LOGIN为登录接口的URL）
        // 请求参数为上面构建的map，服务器返回的结果存储在json字符串中
        String json = HttpClientUtil.doGet(WX_LOGIN, map);

        // 使用JSON.parseObject方法将返回的json字符串解析为JSONObject对象
        JSONObject jsonObject = JSON.parseObject(json);

        // 从解析后的JSONObject对象中获取openid字段的值，openid是用户的唯一标识
        String openid = jsonObject.getString("openid");

        // 返回用户的openid
        return openid;
    }
}
